perm filename T3.OLD[M11,LCS] blob
sn#407392 filedate 1978-12-31 generic text, type T, neo UTF8
00100 SUBROUTINE MSCAN(LL,W)
00200 DIMENSION W(1),TONES(21)
00300 COMMON /TR/I(80),RX(100),JX(100),LX(12),INST(27,5),MX5(40)
00400 1,INSNUM(27),P(30),NPAR(27),JSEM,IPRNT,IPP
00500 1,SRATE,RNCHN,RMAG,INUM,INS,MM,M,N,JJ,X,Y,IK
00600 1,ENDX,J /KNAM/KNAM,IPLAY,JFLNM,IOPEN
00700 COMMON /SBFILN/SBFILN /AR/IOP /IGEN/IGEN /JP/JPRNT,JWRT
00800 C OUT, OSC, AD2, RAN, ENV, STR, AD3, AD4, MLT, SET, RAH, GEN
00900 CXX DOUBLE PRECISION JFLNM
01000 INTEGER RPR
01100 EQUIVALENCE (LESS,LX(9)),
01200 1 (RX2,RX(3)),(P2,P(2)),(RX3,RX(5)),(I3,I(3))
01300 1 ,(ISEMI,LX(2)),(IAST,LX(3))
01400 1,(LPR,LX(11)),(RPR,LX(12)),(ICOM,LX(10)),(LAROW,LX(7))
01500 DATA TONES/246.945,261.62,277.18,277.8,293.66,311.13,311.13,
01600 1 329.63,349.23,329.63,349.23,369.99,369.99,
01700 1 391.99,415.31,415.31,440.0,466.16,466.16,493.89,523.24/
01800
01900 C**** CODE NUMS. 1=OUT 2=OSC 3=AD2 4=RAN 5=END 6=STR 7=AD3 8=AD4 9=MLT
02000 C**** 10=SET 11=RAH 12=END 13=INS 14=OPT B1=101 ETC. P1=201 ETC. F1=301 ETC.
02100 C**** 400=PLAY 401=FINI 402=SRATE 403=NCHNS 404=PRINT 405=CHA 406=POWER
02200 C**** 407=SRT 409=GEN 410=DUR 411=FREQ 412=INSTRUMENT 413=UNIT GEN.
02300 C**** 500=CF 501=C 502=CS 503=DF 504=D 505=DS 506=EF 507=E 508=ES 509=FF
02400 C**** 510=F 511=FS 512=GF 513=G 514=GS 515=AF 516=A 517=AS 518=BF 519=B 520=BS
02500
02600 30 IF(JSEM.NE.0)GO TO 34
02700 LL=1
02800 INS=-1
02900 34 J=J+2
03000 2324 FORMAT(1X20F10.3/)
03100 2325 FORMAT(1X20I/)
03200 2323 FORMAT(1X20A1/)
03300 IXJ=JX(J)
03400 IPP=0
03500 C!FOR 'P3←333;' ETC.
03600 IPOW=0
03700 IOP=-1
03800 IF(IXJ.NE.ISEMI)GO TO 9
03900 10 IF(IGEN.GT.100)W(3)=IGEN
04000 15 JSEM=-1
04100 RETURN
04200 9 IF(J.GE.MM)GO TO 1001
04300 IF(RX(J+1).EQ.-9999.0)GO TO 11
04400 C!*** SKIP IF NUMBER
04500 IF(IGEN.GT.0)GO TO 450
04600
04700 C!***** LOOK FOR SPECIAL WORDS
04800 IF(IXJ/400.NE.1)GO TO 32
04900 K=IXJ-399
05000 GO TO (3,13,304,303,302,303,4,505,505,422)K
05100 32 IF(IXJ.NE.13)GO TO 402
05200 C 13='INS'
05300 KNAM=IXJ
05400 W(1)=2
05500 IGEN=2
05600 GO TO 424
05700 505 JK=4
05800 C !**** FOR SRATE OR SRT
05900 IF(K.NE.4)JK=2
06000 JK=J+JK
06100 GO TO 304
06200
06300 450 K=IXJ
06400 C** HERE FOR INST DEFINITIONS.
06500 CC IF(K.LE.13.AND.K.GT.0)GO TO(425,425,425,425,425
06600 CC 1,425,425,425,425,425,425,411),K
06700 CC IF(K.EQ.14)GO TO 425
06800 C 14='OPT' USER-ADDED UNIT GENERATOR.
06840 IF(K.EQ.12)GO TO 412
06860 IF(K.GT.0)GO TO 425
06900 DO 451 JK=1,40,2
07000 C!*** FOR USER-ADDED UNIT GENS. (UP TO 20)
07100 IF(MX5(JK).NE.IXJ)GO TO 451
07200 W(3)=MX5(JK+1)
07300 GO TO 426
07400 451 CONTINUE
07500 CCC503 IF(JPRNT.LT.0)TYPE 504,IXJ
07600 503 JSEM=0
07700 J=MM
07800 RETURN
07900 504 FORMAT(' UNKNOWN SYMBOL ',A2)
08000 412 LL=3
08100 KNAM=IXJ
08200 IGEN=1
08300 C!*** =1 IS FLAG TO CHANGE IT TO -1
08400 J=MM
08500 INS=-1
08600 GO TO 10
08700 422 W(1)=3
08800 C!***** GEN
08900 KNAM=IXJ
09000 IGEN=0
09100 424 INS=-1
09200 LL=2
09300 GO TO 36
09400 425 W(3)=K+100
09500 426 KNAM=IXJ
09600 436 LL=4
09700 GO TO 36
09800
09900 3 J=J+2
10000 C !**** FOUND 'PLAY;'
10100 IF(JX(J).NE.ISEMI)CALL ERR(1)
10200 IPLAY=-1
10300 JSEM=-1
10400 IF(J.LT.MM)GO TO 34
10500 JSEM=0
10600 PAUSE 'BEFORE LABEL 4'
10700 RETURN
10800 4 JL=LL
10900 JOP=IOP
11000 J=J+2
11100 IF(JX(J).NE.LPR)CALL ERR(2)
11200 IPOW=-1
11300 IOP=-1
11400 GO TO 36
11500 C!**FIND NUM UP TO THE COMMA
11600 7 IF(IPOW.GT.0)GO TO 8
11700 IPOW=1
11800 GO TO 36
11900 8 LL=LL-2
12000 W(LL)=W(LL)**W(LL+1)
12100 IPOW=0
12200 IOP=JOP
12300 C!** GET BACK FLAGS
12400 GO TO 38
12500 302 LL=1
12600 IPRNT=-1
12700 C!***** FOR 'PRINT' FEATURE
12800 GO TO 36
12900 304 SRATE=RX(J+4)
13000 J=J+6
13100 RMAG=512./SRATE
13200 W(3)=4
13300 W(4)=SRATE
13400 351 W(1)=11
13500 W(2)=0
13600 IGEN=0
13700 LL=5
13800 GO TO 15
13900 CCC303 IF(IXJ.EQ.405)J=J-2
14000 303 RNCHN=RX(J+4)
14100 C!**** FOR NCHNS←N; OR CHA ← N;
14200 J=J+6
14300 CC IF(RX(JK+1).NE.-9999.0)JK=JK+2
14400 C!*** SKIP A COMMA
14500 CC IF(JX(JK+2).EQ.ISEMI)GO TO 352
14600 C!*** FOR NCHNS←n;
14700 352 W(3)=8
14800 C!*** FOR NCHNS
14900 W(4)=RNCHN-1
15000 GO TO 351
15100 35 IF(IPLAY.GE.0)CALL ERR(4)
15200 W(2)=INSNUM(IK)
15300 C!**** W IS P ARRAY IN MUSIC5
15400 LL=3
15500 C!**** W(2) AND W(3) WILL BE EXCHANGED LATER
15600 KNAM=IXJ
15700 36 J=J+2
15800 IF(J.GT.MM)GO TO 1001
15900 C!****** 50 = DONE
16000 CC JK=J*2
16100 IXJ=JX(J)
16200 CX TYPE 2324,RX(J+1)
16300 CX TYPE 2323,IXJ
16400 CX TYPE 2325,IXJ,IOP,IGEN
16500 CX PAUSE 'LABEL 36'
16600 IF(IXJ.NE.ISEMI)GO TO 1
16700 JSEM=-1
16800 1000 IF(IPP.EQ.0)GO TO 10
16900 P(IPP)=W(1)
17000 LL=1
17100 IPP=0
17200 IF(J.LT.MM)GO TO 30
17300 INS=-1
17400 C!*** I HOPE THIS IS THE RIGHT PLACE FOR THIS.
17500 1001 IF(IGEN.EQ.0.OR.JSEM.EQ.0)JSEM=1
17600 IF(JSEM)JSEM=0
17700 CX PAUSE 'LABEL 1001'
17800 RETURN
17900
18000 1 IF(RX(J+1).NE.-9999.0)GO TO 2
18100 CX TYPE 2325,IOP
18200 CX PAUSE 'LABEL 1'
18300 11 IF(IOP.LT.0)GO TO 40
18400 IF(IOP.NE.5)GO TO 12
18500 RX(J)=-RX(J)
18600 C!*** IOP=5 MEANS MINUS WITH COMMA IN FRONT
18700 W(LL)=RX(J)
18800 LL=LL+1
18900 GO TO 14
19000 12 CALL ARITH(RX(J),W,LL)
19100 14 IOP=-1
19200 C!*** RESET OPERATOR FLAG
19300 GO TO 36
19400 C!*** USE PARENTH'S FOR COMPOSITE EXPRESSIONS!!!!
19500
19600 40 W(LL)=RX(J)
19700 38 LL=LL+1
19800 IF(IOP.LT.0)GO TO 36
19900 C IOP = NEG = NO OPERATOR BEFORE THIS ITEM.
20000 LL=LL-1
20100 380 CALL ARITH(W(LL),W,LL)
20200 GO TO 14
20300
20400 402 IF(JSEM.GT.0)GO TO 2
20500 C!**** READING CONTINUATION LINE.
20600 IF(IXJ.GE.0)GO TO 33
20700 C NEXT TRIES TO FIND INST. NAME.
20800 NA=-1-IXJ
20900 M=JX(J+1)
21000 C NA POINTS TO SPOT IN I ARRAY, M IS WDCNT.
21100 DO 133 IK=1,INUM
21200 DO 233 II=1,M
21300 233 IF(INST(IK,II).NE.I(II+NA))GO TO 133
21400 C NOW WE FOUND AN INST. NAME.
21500 C******* INST NAMES CANNOT HAVE SAME STRING OF 1ST LETTERS AS OTHER THINGS.
21600 333 IF(M.EQ.5)GO TO 35
21700 M=M+1
21800 IF(INST(IK,M).EQ.0)GO TO 333
21900 133 CONTINUE
22000 33 INS=2
22100 C! NEXT IS SOMETHING OUTSIDE OF INST. AND PARAMS.
22200
22300 2 IF(IGEN.GT.0)GO TO 427
22400 IF(IXJ.GT.520)GO TO 341
22500 IF(IXJ.LT.500)GO TO 427
22600 C NOW FOUND A NOTE
22700 K=IXJ-499
22800 W(LL)=TONES(K)
22900 GO TO 38
23000 C!***** FINDS NOTE IN SCALE
23100
23200 C!****** FIND A PARAM NUM.
23300 427 IF(IXJ.GE.300)GO TO 307
23400 IF(IXJ.LT.200)GO TO 344
23500 K=IXJ-200
23600 C NOW K HAS PARAM NUM.
23700 IF(INS.LE.0)GO TO 340
23800 JK=J+2
23900 IF(JX(JK).NE.LAROW)GO TO 340
24000 IPP=K
24100 LL=1
24200 J=JK
24300 GO TO 36
24400 340 W(LL)=P(K)
24500 C!***** FOUND Pn
24600 IF(IPRNT.LT.0)GO TO 38
24700 IF(IGEN.GT.0)W(LL)=K+2.
24800 C!*** PARAM NUMS ARE 2 LESS THAN IN BOOK.
24900 GO TO 38
25000 C!**** P4 IS CHANGED TO 6
25100 307 IF(IXJ.GE.400)GO TO 344
25200
25300 IF(IXJ/300.NE.1)GO TO 344
25400 JL=IXJ-300
25500 IF(IGEN.GT.0)JL=-JL-100
25600 C!*** FOR Fn IN INST DEFINITION
25700 W(LL)=JL
25800 GO TO 38
25900 344 CONTINUE
26000
26100 IF(IGEN.LE.0)GO TO 341
26200 C*** FOR B1, ETC. IN INST. DEFS.
26300 IF(IXJ/100.NE.1)GO TO 341
26400 W(LL)=100-IXJ
26500 GO TO 38
26600 342 CONTINUE
26700
26800 341 DO 39 K=3,6
26900 IF(LX(K).NE.IXJ)GO TO 39
27000 IOP=K-2
27100 JK=JX(J-2)
27200 IF(JK.EQ.ICOM)IOP=5
27300 C!** COMMA DISABLES NEXT OPERATOR
27400 IF(JK.EQ.LAROW)IOP=5
27500 C!** ← DISABLES NEXT OPERATOR
27600 IF(JK.EQ.LPR)IOP=5
27700 C!** LFT PARENTH. DISABLES NEXT OPERATOR
27800 GO TO 36
27900 39 CONTINUE
28000 308 IF(IXJ.EQ.LAROW)GO TO 36
28100 C!*** PASS LEFT ARROW
28200 IF(IXJ.EQ.406)GO TO 4
28300 C 406='POWER'
28400 IF(IXJ.EQ.RPR)GO TO 500
28500 IF(IXJ.EQ.LPR)GO TO 500
28600 C LEFT AND RIGHT PARENTHESES
28700 IF(IXJ.NE.402)GO TO 510
28800 C 402=SRATE
28900 W(LL)=SRATE
29000 335 LL=LL+1
29100 GO TO 36
29200 C**** OR SHOULD NEXT BE 403???
29300 510 IF(IXJ.NE.403)GO TO 511
29400 C 403-'NCHNS'
29500 W(LL)=RNCHN
29600 GO TO 335
29700 511 IF(IXJ.NE.ICOM)GO TO 503
29800 C!***** UNKNOWN CHAR.
29900 500 IF(IPOW.NE.0)GO TO 7
30000 IF(IXJ.NE.LPR)GO TO 501
30100 JPOW=IPOW
30200 IPOW=0
30300 KOP=IOP
30400 IOP=-1
30500 JL=LL
30600 C!**** SAVE VARIOUS POINTERS WHEN INSIDE PARENTHS.
30700 GO TO 36
30800 501 IF(IXJ.NE.RPR)GO TO 502
30900 IPOW=JPOW
31000 C!*** GET BACK STUFF
31100 IOP=KOP
31200 IF(IOP.LT.0)GO TO 36
31300 LL=JL
31400 GO TO 380
31500 C!GO DO ARITHMETIC
31600 502 IF(IPRNT)GO TO 36
31700 C!**** FOUND COMMA IN PRINT STATEMENT.
31800 5 IF(JX(J-2).NE.ICOM)GO TO 132
31900 433 W(LL)=P(LL-2)
32000 C!** ONLY CARES ABOUT 2 COMMAS IN A ROW
32100 GO TO 335
32200 132 IF(INS.GE.0)GO TO 36
32300 IF(LL.EQ.3)GO TO 433
32400 C!*** =3 MEANS COMMA FOR P1.
32500 GO TO 36
32600
32700 13 LL=2
32800 IPLAY=0
32900 C!*** TURN OFF PLAY FLAG
33000 W(1)=6
33100 W(2)=ENDX+.5
33200 C!***** ENDX IS P1+P2 OF THE LONGEST LASTING INST.
33300 IF(JPRNT)TYPE 51,LL,W(1),W(2)
33400 IF(JWRT)CALL CLOSIT(LL,W)
33500 130 J=MM
33600 JSEM=99
33700 C!*** WON'T READ LINE BEYOND 'FINISH;' ***************
33800 ENDX=-1
33900 51 FORMAT(I3,35F10.3)
34000 END
34100